const superagent = require('superagent');
const cheerio = require('cheerio');
const pwdEncrypt = require('./encrypt')



/**
 * 
 * 功能：将查询字符串转换为JSON对象
 * 
 * @param {string} str url中的查询字符串
 * @returns {Object} 转换后的JSON对象
 */
function strtojson(str) {
  var arr = str.split('&')
  var json = {}
  for (var i in arr) {
    var k = arr[i].split("=")[0]
    var v = arr[i].split("=")[1]
    json[k] = v
  }
  return json
}



/**
 * 
 * 功能：进行网上办事大厅登录功能，并返回登录后的会话维持实例
 * 
 * @param {string} stu 学生账号
 * @param {string} passwd 教务系统密码
 * @returns {Object} superagent.agent 带有会话维持信息的（含有cookiejar）的对象
 */
const ehallLogin = async function (stu, passwd) {
  let isLoginSucess = false

  // 创建会话维持对象
  let agent = superagent.agent()

  // 处理用户登录数据的url，POST数据的目标URL
  const ehallLoginUrl = 'https://authserver.ecut.edu.cn/authserver/login?service=https://ehall.ecut.edu.cn:443/login'

  // 用户登录时，网上办事大厅需要接受的数据包
  let loginData = {
    username: stu,
    password: '',   //登录时，前端会对密码进行AES加密，这里保留密码字段不填写
    lt: '',
    dllt: 'userNamePasswordLogin',
    execution: '',
    _eventId: 'submit',
    rmShown: 1
  }


  // 获取用于用户密码加密的密钥
  await agent.get(ehallLoginUrl).then(function (res) {
    let $ = cheerio.load(res.text)
    loginData.password = pwdEncrypt(passwd, $('#pwdDefaultEncryptSalt').val())
    loginData.lt = $('input[name=lt]').val()
    loginData.execution = $('input[name=execution]').val()
  }).catch((err) => {
    return false
  })



  // 进行登录，提交数据到登录url
  await agent
    .post(ehallLoginUrl)
    .set('Content-Type', 'application/x-www-form-urlencoded')
    .send(loginData).then(function (res) {
      if (res.redirects.length === 0) {
        isLoginSucess = false
      } else {
        isLoginSucess = true
      }
    }).catch(err => {
      return false
    })


  return isLoginSucess ? agent : false
}



/**
 * 
 * 功能：进行webVpn登录功能，并返回登录后的会话维持实例
 * 
 * @param {string} stu 学生账号
 * @param {string} passwd 教务系统密码
 * @returns {Object} superagent.agent 带有会话维持信息的（含有cookiejar）的对象
 */
const webvpnLogin = async function (stu, passwd) {
  let agent = superagent.agent()

  // webvpn登陆POST数据
  let webvpnData = {
    utf8: '%E2%9C%93',
    'user[login]': stu,
    'user[password]': passwd,
    'user[dymatice_code]': 'unknown',
    'user[otp_with_capcha]': false,
    'input[name=authenticity_token]': '',
    commit: '登录 Login'
  }

  // 填写authenticity字段
  await agent.get('https://webvpn.ecut.edu.cn/users/sign_in').then(function (res) {
    if (res.statusCode === 200) {
      let $ = cheerio.load(res.text)
      webvpnData.authenticity_token = $(
        'input[name=authenticity_token]'
      ).val()
    }
  })


  // 登陆webvpn
  await agent
    .post('https://webvpn.ecut.edu.cn/users/sign_in')
    .set('Content-Type', 'application/x-www-form-urlencoded')
    .send(webvpnData)


  const webvpnEhallUrl = 'https://172-20-130-13.webvpn.ecut.edu.cn/sso/jziotlogin'
  var loginData = {
    username: stu,
    password: '',
    lt: '',
    dllt: 'userNamePasswordLogin',
    execution: '',
    _eventId: 'submit',
    rmShown: 1
  }

  // webvpnEhall 获取webvpn教务系统页面的salt
  await agent.get(webvpnEhallUrl).then(function (res) {
    let $ = cheerio.load(res.text)
    loginData.password = pwdEncrypt(passwd, $('#pwdDefaultEncryptSalt').val())
    loginData.lt = $('input[name=lt]').val()
    loginData.execution = $('input[name=execution]').val()
  })
  const webvpnEhallLoginUrl = 'https://authserver-443.webvpn.ecut.edu.cn/authserver/login?service=https://172-20-130-13.webvpn.ecut.edu.cn/sso/jziotlogin'



  // 登陆webvpn的ehall
  await agent
    .post(webvpnEhallLoginUrl)
    .set('Content-Type', 'application/x-www-form-urlencoded')
    .send(loginData)





  // 课表获取
  // const getScheduleUrl = `https://172-20-130-13.webvpn.ecut.edu.cn/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005&su=${stu}`

  // let postData = {
  //   xnm: 2020,
  //   xqm: 3,
  //   _search: false,
  //   nd: 1622722782565,
  //   'queryModel.showCount': 15,
  //   'queryModel.currentPage': 1,
  //   'queryModel.sortName': '',
  //   'queryModel.sortOrder': 'asc',
  //   time: 3
  // }

  // await agent.post(getScheduleUrl)
  //   .set('Content-Type', 'application/x-www-form-urlencoded')
  //   .send(postData).then(function (res) {
  //     // console.log(JSON.parse(res.text).items);
  //   })




  // // 学生成绩查询
  // const getScoreUrl = `https://172-20-130-13.webvpn.ecut.edu.cn/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005&su=${stu}`


  // let getScoreData = {
  //   xnm: 2020,
  //   xqm: 3,
  //   _search: false,
  //   nd: 1622724068362,
  //   'queryModel.showCount': 15,
  //   'queryModel.currentPage': 1,
  //   'queryModel.sortName': '',
  //   'queryModel.sortOrder': 'asc',
  //   time: 1
  // }

  // await agent.post(getScoreUrl)
  //   .set('Content-Type', 'application/x-www-form-urlencoded')
  //   .send(getScoreData)
  //   .then(function (res) {
  //     JSON.parse(res.text).items.map(x => {
  //       console.log(x.bfzcj, '---', x.kcmc);
  //     });
  //   })

  return agent
}



module.exports = {
  ehallLogin,
  webvpnLogin
}

